#include "fenetreprincipale.h"
#include "ui_fenetreprincipale.h"
#include <QCloseEvent>
#include "options.h"

/********************************************************************************************
                                       CONSTRUCTEUR
********************************************************************************************/

FenetrePrincipale::FenetrePrincipale(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::FenetrePrincipale)
{
    ui->setupUi(this);

    // OPTIONS
    this->ChargerOptions();

    // SLOT MENU
    connect(this->ui->actionQuitter, SIGNAL(triggered()), this, SLOT(close()));

    //SLOT CONFIGURATION
    connect(this->ui->btnAjouterDossier, SIGNAL(clicked()), this, SLOT(AjouterDossier()));
    connect(this->ui->btnRetirerDossier, SIGNAL(clicked()), this, SLOT(RetirerDossier()));
    connect(this->ui->btnSynchroDossier, SIGNAL(clicked()), this, SLOT(SynchroDossier()));
    connect(this->ui->btnEnregistrerOptions, SIGNAL(clicked()), this, SLOT(EnregistreOptions()));
    connect(this->ui->btnOptionsParDefaut, SIGNAL(clicked()),this, SLOT(OptionsParDefaut()));

    // CONNEXION A LA BDD
    db.Connexion(this->optionNomBdd);
    db.ConstruireTables();

    // AFFICHAGE
    this->AfficherDossiers();
    this->AfficherFilms();
}

/********************************************************************************************
                                       ACCESSEURS
********************************************************************************************/


/********************************************************************************************
                                       PARAMETRAGE
********************************************************************************************/

// Charge et instancie les options du logiciel
void FenetrePrincipale::ChargerOptions()
{
    // Affectation des options
    options opt;
    this->optionNomBdd = opt.nomBdd();
    this->optionExtensions = opt.extensions();
    this->optionFiltresNomFichier = opt.filtresNomFichier();
    // Affichage des options
    this->ui->editExtentions->setText(this->optionExtensions);
    this->ui->editFiltresNomFichier->setText(this->optionFiltresNomFichier);
}

// Enregistre les options dans un fichier ou dans le registre selon le système d'exploitation
void FenetrePrincipale::EnregistreOptions()
{
    //TODO : si le texte saisi correspond au regexp sinon erreur (pour les deux options)
    //QRegexp regExtentions, regFiltres;
    this->optionExtensions = this->ui->editExtentions->text();
    this->optionFiltresNomFichier = this->ui->editFiltresNomFichier->text();
    options opt;
    opt.setExtensions(this->optionExtensions);
    opt.setFiltresNomFichier(this->optionFiltresNomFichier);
}

void FenetrePrincipale::OptionsParDefaut()
{
    options::OptionsParDefaut();
    this->ChargerOptions();
}

/********************************************************************************************
                                       FONCTIONS CONFIGURATION
********************************************************************************************/

void FenetrePrincipale::AfficherDossiers()
{
    // On vide le listWidget
    this->ui->listConfigDossier->clear();
    // On récupère la liste des dossiers
    QList<dossier> listeDossiers = dossier::ListeDossiers();

    // On ajoute chaque dossier au listWidget
    for (int i=0; i < listeDossiers.count(); i++)
    {
        QListWidgetItem *item = new QListWidgetItem(listeDossiers.at(i).path(), this->ui->listConfigDossier);
        this->ui->listConfigDossier->addItem(item);
    }
}

void FenetrePrincipale::AfficherFilms()
{
    // On vide le listWidget
    this->ui->listNav->clear();
    // On récupère la liste des films
    QList<film *> listeF = film::ListeFilms();

    // On ajoute chaque dossier au listWidget
    for (int i=0; i < listeF.count(); i++)
    {
        QListWidgetItem *item = new QListWidgetItem(listeF[i]->titre(), this->ui->listNav);
        this->ui->listNav->addItem(item);
    }
}

/********************************************************************************************
                                       SLOTS CONFIGURATION
********************************************************************************************/

void FenetrePrincipale::AjouterDossier()
{
    // Affichage d'un dialog de sélection de dossiers
    QFileDialog parcourir;
    QString chemin = parcourir.getExistingDirectory(this, "Sélectionner un dossier", "", QFileDialog::ShowDirsOnly);
    dossier dir(chemin);

    // Si le dossier existe
    if (!chemin.isEmpty() && dir.exists())
    {
        // Ajout du dossier à la bdd
        dir.Enregistre();
       // Si l'ajout réussi
        if (!db.Requete().lastError().isValid())
        {
            // On met à jour l'affichage
            this->AfficherDossiers();
        }
    }
}

void FenetrePrincipale::RetirerDossier()
{

    // On essaie de supprimer l'enregistrement de la base de données
    if (this->ui->listConfigDossier->selectedItems().count()!=0)
    {
        dossier dir(this->ui->listConfigDossier->selectedItems().first()->text());
        dir.Supprime();
    }

    // Si la suppression réussie
    if (!db.Requete().lastError().isValid())
    {
        // On met à jour l'affichage
        this->AfficherDossiers();
    }
}

void FenetrePrincipale::SynchroDossier()
{
    ui->btnSynchroDossier->setEnabled(false);

    // On crée la liste de tous les fichiers correspondant aux filtres, dans tous les dossiers
    //apiAllocine * api = new apiAllocine(this);
    QFileInfoList listeFichiers;
    QStringList filtres = this->optionExtensions.split(";", QString::SkipEmptyParts);
    // On récupère la liste des dossiers
    QList<dossier> listeDossiers = dossier::ListeDossiers();

    for(int i=0; i<listeDossiers.count(); i++)
    {
        listeFichiers.clear();
        listeFichiers << listeDossiers.at(i).entryInfoList(filtres, QDir::Files | QDir::Hidden | QDir::NoSymLinks);

        // Pour chaque fichier
        for (int j=0; j<listeFichiers.count(); j++)
        {
            // S'il n'est pas déjà dans la base de données
            if(this->db.EstDansLaBase("SELECT idFichier FROM fichier WHERE nomFichier="
                                       +db.TexteVersSql(listeFichiers.at(j).fileName()))==-1)
            {
                // On détermine les infos du fichier
                fichier* unFichier = new fichier(listeFichiers.at(j).fileName());
                if(unFichier->file()->fileName().contains("cd1",Qt::CaseInsensitive))
                    unFichier->setCdFilm(1);
                else if(unFichier->file()->fileName().contains("cd2",Qt::CaseInsensitive))
                    unFichier->setCdFilm(2);
                else
                    unFichier->setCdFilm(0);
                // TODO : a revoir : peut etre VF VOST (mkv) -> REGEXP
                if(unFichier->file()->fileName().contains("vf",Qt::CaseInsensitive))
                    unFichier->setLangueFilm("VF");
                else if(unFichier->file()->fileName().contains("vost",Qt::CaseInsensitive))
                    unFichier->setLangueFilm("VOST");
                else
                    unFichier->setLangueFilm("");

                unFichier->setIdDossier(listeDossiers[i].id());

                QFileInfo infoFichier = QFileInfo(*unFichier->file());

//                film leFilm(infoFichier.baseName());
//                leFilm.parserToutSynchrone();
//                leFilm.Enregistre();


                film* leFilm = new film(infoFichier.baseName());
                leFilm->NouvelId();
                leFilm->parserTout();
                leFilm->connect(leFilm, SIGNAL(film_parse()), leFilm, SLOT(enregistrement()));

                unFichier->setIdFilm(leFilm->id());
                leFilm->connect(leFilm, SIGNAL(film_parse()), unFichier, SLOT(enregistrement()));

                //api->RechercheFilm(infoFichier.baseName());

            }
    }

        // Nettoyage : on cherche les fichiers de la base qui n'existent plus
        // on les supprime

        // Affichage des films ou personnes selon le combo selectionné dans l'onglet navigation (deux fonctions a faire AffichePersonne et AfficheFilm)
    }
    ui->btnSynchroDossier->setEnabled(true);
}

// Sauvegarde les options à la fermeture du logiciel
void FenetrePrincipale::closeEvent(QCloseEvent  *event)
{
    if(this->ui->editExtentions->text() != this->optionExtensions ||
            this->ui->editFiltresNomFichier->text() != this->optionFiltresNomFichier)
    {
        int retour = QMessageBox(QMessageBox::Question,"Confirmation",
                        "Voulez-vous enregistrer les options qui ont été modifiées ?",
                        QMessageBox::Yes | QMessageBox::No).exec();

        if (retour == QMessageBox::Yes)
            this->EnregistreOptions();
    }

    event->accept();
}

FenetrePrincipale::~FenetrePrincipale()
{
    delete ui;
}
